home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / presto / presto10.lha / src / locks.h < prev    next >
C/C++ Source or Header  |  1991-12-11  |  2KB  |  93 lines

  1. #ifndef __presto__locks_h__
  2. #define __presto__locks_h__
  3.  
  4. //
  5. // Locks and monitors
  6. //
  7.  
  8. class Lock : public SynchroObject    {
  9.     Thread    *lo_owner;
  10.     void    lock2();            // looping lock
  11. public:
  12.     Lock(char *name=0);
  13.     Lock(char *name, int locktype);
  14.     ~Lock();
  15.     void lock();        // no competition
  16.     void unlock();
  17.     Thread *owner()
  18.         { return  lo_owner; }
  19.     virtual void print(ostream& = cout);
  20. };
  21.  
  22. class Monitor : public Lock         {
  23. public:
  24.     Monitor(char* name=0);
  25.     ~Monitor();
  26.     inline void entry()
  27.         { Lock::lock(); }
  28.     inline void exit()
  29.         { Lock::unlock(); }
  30.     Thread *owner()
  31.         { return Lock::owner(); }
  32.     virtual void print(ostream& = cout);
  33. };
  34.  
  35. //
  36. // Syntactic sugaring for automatically releasing monitors on
  37. // subroutine exit.  Should only be built on the stack.
  38. //
  39. class MONITOR    {
  40.     Monitor *mo_mon;
  41. public:
  42.     MONITOR(Monitor *m)
  43.         { mo_mon = m; m->entry(); }
  44.     inline MONITOR(Monitor& m)
  45.         { mo_mon = &m; m.entry(); }
  46.     inline ~MONITOR()
  47.         { register Monitor* m = mo_mon; m->exit(); }
  48. };
  49.  
  50.  
  51.  
  52. class MonitorQ : public Oqueue    {
  53. public:
  54.     MonitorQ(Monitor* m = 0) : Oqueue ( m )
  55.         {;}
  56.     ~MonitorQ()
  57.         { cerr << "monitorq destructor called\n"; }
  58.     Monitor*    get()
  59.         { return (Monitor*)Oqueue::get(); }
  60.     Monitor*    lookat()
  61.         { return (Monitor*)Oqueue::lookat(); }
  62.     void        append(Monitor *m)
  63.         { Oqueue::append(m); }
  64.     void        prepend(Monitor *m)
  65.         { Oqueue::prepend(m); }
  66.     void        remove(Monitor *m)
  67.         { Oqueue::remove(m); }
  68. };
  69.  
  70.  
  71. class Condition : public SynchroObject    {
  72.     Monitor*    co_monitor;        // bound monitor
  73. public:
  74.     Condition(char* name=0);    // unbound
  75.     Condition(Monitor* boundmon);    // bound, no name
  76.     Condition(Monitor& boundmon);
  77.     Condition(Monitor* boundmon, char* name);
  78.     Condition(Monitor& boundmon, char* name);
  79.     Monitor* monitor()
  80.         { return co_monitor; }
  81.     int threadok()                // is cond user legit
  82.         { return ((!co_monitor) ||     // unbound is free4all
  83.              (thisthread == co_monitor->owner()));}  
  84.     ~Condition();
  85.     void signal();            // wakeup one
  86.     void broadcast();        // wakeup all
  87.     void wait();            // wait for signal (could pickup old)
  88.     virtual void print(ostream& = cout);
  89. };
  90.  
  91.  
  92. #endif /* __presto__locks_h__ */
  93.